package com.openNetty.common.system;

import java.io.*;
import java.net.URL;
import java.net.URLDecoder;

/**
 * @author zhenggm
 * @create 2017-11-20 下午 4:17
 **/


public class IOUtil {
    /**
     * 根据相对路径获取包外的文件
     *
     * @param relativePath 文件相对jar包的路劲
     * @return 包外文件对象
     */
    public static File getFileOutJar(String relativePath) {
        return getFileOutJar(relativePath, IOUtil.class);
    }

    /**
     * 根据相对路径获取包外的文件
     *
     * @param codeClass    jar包中的类对象
     * @param relativePath 文件相对jar包的路劲
     * @return 包外文件对象
     */
    public static File getFileOutJar(String relativePath, Class<?> codeClass) {
        URL url = codeClass.getProtectionDomain().getCodeSource().getLocation();
        String path = null;
        try {
            path = URLDecoder.decode(url.getPath(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        if (path == null) {
            return null;
        }
        return new File(path, relativePath);
    }

    /**
     * 根据相对路径获取包外的文件的输入流
     *
     * @param relativePath 文件相对jar包的路劲
     * @return 包外文件对象的输入流
     */
    public static InputStream getInputStreamOutJar(String relativePath) {
        File file = getFileOutJar(relativePath);
        if (file != null && file.exists()) {
            try {
                return new FileInputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 根据相对路径获取包外的文件的输入流
     *
     * @param relativePath 文件相对jar包的路劲
     * @param codeClass    jar包中的类对象
     * @return 包外文件对象的输入流
     */
    public static InputStream getInputStreamOutJar(String relativePath, Class<?> codeClass) {
        File file = getFileOutJar(relativePath, codeClass);
        if (file != null && file.exists()) {
            try {
                return new FileInputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 根据相对路径获取包外的文件的输出流
     *
     * @param relativePath 文件相对jar包的路劲
     * @return 包外文件对象的输出流
     */
    public static OutputStream getOutputStreamOutJar(String relativePath) {
        File file = getFileOutJar(relativePath);
        if (file != null && file.exists()) {
            try {
                return new FileOutputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        return null;
    }

    /**
     * 根据相对路径获取包外的文件的输出流
     *
     * @param relativePath 文件相对jar包的路劲
     * @param codeClass    jar包中的类对象
     * @return 包外文件对象的输出流
     */
    public static OutputStream getOutputStreamOutJar(String relativePath, Class<?> codeClass) {
        File file = getFileOutJar(relativePath, codeClass);
        if (file != null && file.exists()) {
            try {
                return new FileOutputStream(file);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
        return null;
    }


    /**
     * 获取当前执行路径
     */
    public static String getCurrentExecutePath(Class<?> cl) {
        URL url = cl.getProtectionDomain().getCodeSource().getLocation();
        String path = null;
        try {
            path = URLDecoder.decode(url.getPath(), "UTF-8");
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        return path;
    }
}
